package heap

func (self *Class) NewArray(count uint) *Object {
	if !self.IsArray() {
		panic("Not array class: " + self.name)
	}

	/*
		注释:
			B: 基本类型 byte		J: 基本类型 long
			C: 基本类型 char		S: 基本类型 short
			D: 基本类型 double	Z: 基本类型 boolean
			F: 基本类型 float		V: 特殊类型 void
			I: 基本类型 int		L: 对象类型

		数组声明：
			int[] arr = new int[1];
		因为数组实例化数组类后必须要赋给一个数组变量，所以引用计数直接++
	*/
	switch self.Name() {
	case "[Z":
		return &Object{self, make([]int8, count), nil, 1}
	case "[B":
		return &Object{self, make([]int8, count), nil, 1}
	case "[C":
		return &Object{self, make([]uint16, count), nil, 1}
	case "[S":
		return &Object{self, make([]int16, count), nil, 1}
	case "[I":
		return &Object{self, make([]int32, count), nil, 1}
	case "[F":
		return &Object{self, make([]float32, count), nil, 1}
	case "[D":
		return &Object{self, make([]float64, count), nil, 1}
	default:
		return &Object{self, make([]*Object, count), nil, 1}
	}
}

func (self *Class) IsArray() bool {
	return self.name[0] == '['
}

// 根据数组类名得到数组元素类名
func (self *Class) ComponentClass() *Class {
	componentClassName := getComponentClassName(self.name)
	return self.loader.LoadClass(componentClassName)
}
